/**
 * Функционал для динамической подгрузки ресурсов. 123
 */
var PinenutResources = {

	/**
	 * Список подключенных пакетов
	 */
	packagesList : [],
	packagesLoadIndicator : [],

	/**
	 * Загружает ресурсы по указанному конфигу
	 *
	 * Формат конфига:
	 * {
	 * 		'package_name_1' : {
	 * 			'js' : [
	 * 				'js_url_1',
	 * 				'js_url_2',
	 * 				'js_url_3',
	 * 				...
	 * 				'js_url_N',
	 * 			],
	 * 			'css' : [
	 * 				'css_url_1',
	 * 				'css_url_2',
	 * 				'css_url_3',
	 * 				...
	 * 				'css_url_N',
	 * 			],
	 * 		},
	 * 		...
	 * 		'package_name_N' : {...}
	 * }
	 *
	 * @param config - json-конфиг
	 */
	'loadResources': function (config, callback) {
		var $this = this;

		// Преобразуем json-конфиг в объект
		config = $.parseJSON(config);

		// Загружаем ресурсы пакетов, которые не были подключены ранее
		$.each(config, function (packageName, value) {

			// Если пакет был подключен ранее - пропускаем его обработку
			if ($this.packagesList.indexOf(packageName) != -1) {
				return;
			}

			$this.packagesLoadIndicator[packageName] = {'count' : 0, 'callback' : callback};

			// Загружаем скрипты
			if (config[packageName]['js'] !== undefined) {
				$.each(config[packageName]['js'], function (index, url) {
					$this.loadJs(url, packageName);
				});
			}

			// Загружаем стили
			if (config[packageName]['css'] !== undefined) {
				$.each(config[packageName]['css'], function (index, url) {
					$this.loadCss(url, packageName);
				});
			}

			// Добавляем имя пакета в список подключенных пакетов
			$this.packagesList.push(packageName);
		});
	},

	/**
	 * Добавляет в DOM css по url
	 *
	 * @param url - ссылка на ресурс
	 */
	'loadCss': function (url, packageName) {
		var $this = this;

		var resourceLink = document.createElement("link");
		resourceLink.setAttribute("rel", "stylesheet");
		resourceLink.setAttribute("type", "text/css");
		resourceLink.setAttribute("href", url);
		resourceLink.onload = function () {
			if($this.checkPackageIsLoaded(packageName)) {
				$this.runPackageCallback(packageName);
			}
		};
		document.getElementsByTagName("body")[0].appendChild(resourceLink);
	},

	/**
	 * Добавляет в DOM js по url
	 *
	 * @param url
	 */
	'loadJs': function (url, packageName) {
		var $this = this;

		var resourceLink = document.createElement('script');
		resourceLink.setAttribute("type", "text/javascript");
		resourceLink.setAttribute("src", url);
		resourceLink.onload = function () {
			if($this.checkPackageIsLoaded(packageName)) {
				$this.runPackageCallback(packageName);
			}
		};
		document.getElementsByTagName("body")[0].appendChild(resourceLink);
	},

	/**
	 * Проверяет, все ли ресурсы пакета были динамически загружены
	 *
	 * @param packageName - имя пакета
	 * @returns {boolean}
	 */
	'checkPackageIsLoaded' : function (packageName) {
		if (
			this.packagesLoadIndicator[packageName] === undefined ||
			this.packagesLoadIndicator[packageName].count > 0 ||
			this.packagesLoadIndicator[packageName].callback === undefined
		)
		{
			return false;
		}

		return true;
	},

	/**
	 *	Запукает обработчик, если все ресурсы пакеты были динамически загружены
	 *
	 * @param packageName - имя пакета
	 */
	'runPackageCallback' : function (packageName) {
		var callback = this.packagesLoadIndicator[packageName].callback;
		callback();
	},

	addPackages : function (list) {
		var packagesList = this.packagesList;

		$.each(list, function(index, value) {
			if (packagesList.indexOf(value) != -1) {
				return;
			}

			packagesList.push(value);
		});
	}
};
